#include "mainwidget.h"
#include "ui_mainwidget.h"
#include "log.h"
#include "log.cpp"

#include <QSqlTableModel>
#include <QTableView>
#include <QSqlDatabase>
#include <QSqlRelationalDelegate>
#include <QSqlRecord>

#include <QMessageBox>
#include <QSqlError>

mainWidget::mainWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::mainWidget)
{
    ui->setupUi(this);

    // 链接数据库服务器
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");
    db.setPort(3306);
    db.setUserName("root");
    db.setPassword("123456");

    this->stuModel = new QSqlRelationalTableModel(this);

    // 1. 查询(将student表中的数据取出来，显示到tableView中)
    //  指定模型管理哪张数据表
    this->stuModel->setTable("student");

    // 查询之前设置关联关系
    // 参数1:  设置关联其他表的外键索引号
    // 参数2:  QSqlRelation 对象，用来配置被关联的表的信息
    //     参数1: 被关联的表名
    //     参数2: 被关联的字段名
    //     参数3: 最终显示到tableView当中的字段
    this->stuModel->setRelation(6, QSqlRelation("dept", "dno", "dname"));

    // 通过模型查询数据
    this->stuModel->select();


    ui->tableView_chuankou_2->setItemDelegate(new QSqlRelationalDelegate(ui->tableView_chuankou_2));


    // 让视图关联模型，关联成功后，就会将模型中的数据显示到 tableView 中
    ui->tableView_chuankou_2->setModel(this->stuModel);

    // 修改表头
    this->stuModel->setHeaderData(0, Qt::Horizontal, "port_no");
    this->stuModel->setHeaderData(1, Qt::Horizontal, "com_no");
    this->stuModel->setHeaderData(2, Qt::Horizontal, "com_mm");
    this->stuModel->setHeaderData(3, Qt::Horizontal, "baudrate");
    this->stuModel->setHeaderData(4, Qt::Horizontal, "databit");
    this->stuModel->setHeaderData(5, Qt::Horizontal, "stopbit");
    this->stuModel->setHeaderData(6, Qt::Horizontal, "checkbit");
    this->stuModel->setHeaderData(7, Qt::Horizontal, "flowcontrol");
    this->stuModel->setHeaderData(8, Qt::Horizontal, "rx_time");
    this->stuModel->setHeaderData(9, Qt::Horizontal, "tx_time");

    // 设置表格的显示模式
    ui->tableView_chuankou_2->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);

    ui->tableView_chuankou_2->setAlternatingRowColors(true);


    // 修改模型的提交方式（更新数据表的方式）
    this->stuModel->setEditStrategy(QSqlTableModel::OnManualSubmit);


    // 1. 初始化模型并设置表头
    // 1. 先创建模型
    QStandardItemModel *logModel = new QStandardItemModel(this);

    // 2. 将模型设置到tableView
    ui->tableView_rizhi_2->setModel(logModel);

    // 3. 创建Logger实例
    Log *logger = new Log(logModel, this);


}

mainWidget::~mainWidget()
{
    delete ui;
}

void mainWidget::on_btn_shangyiye_rizhi_2_clicked()
{
    //上一页
    if (this->currentPage > 1)
    {
        this->currentPage--;
        ui->btn_shangyiye_rizhi_2->setEnabled(true);
    }
    else
    {
        ui->btn_shangyiye_rizhi_2->setEnabled(false);
    }
    ui->btn_xiayiye_rizhi_2->setEnabled(true);
}

void mainWidget::on_btn_xiayiye_rizhi_2_clicked()
{
    //下一页
    int totalPages = (logLines.size() + pageSize - 1) / pageSize;
    if (this->currentPage < totalPages)
    {
        this->currentPage++;
        ui->btn_xiayiye_rizhi_2->setEnabled(true);
    }
    else
    {
        ui->btn_xiayiye_rizhi_2->setEnabled(false);
    }
    ui->btn_shangyiye_rizhi_2->setEnabled(true);
}

void mainWidget::on_btnSave_clicked()
{
    if (!model->submitAll()) {
            QMessageBox::critical(this, "错误", "保存失败: " + model->lastError().text());
        } else {
            QMessageBox::information(this, "成功", "数据已保存");
        }
}

void mainWidget::on_btnAdd_clicked()
{
    int row = model->rowCount();
        model->insertRow(row);
        QModelIndex index = model->index(row, 0);
        ui->tableView_chuankou_2->setCurrentIndex(index);
        ui->tableView_chuankou_2->edit(index);
}


void mainWidget::on_btn_baocun_yonghu_2_clicked()
{
    this->stuModel->submitAll();
}

void mainWidget::on_btn_zengjia_yonghu_2_clicked()
{
    // 1. 创建一个新的空行（空记录）
    QSqlRecord record = this->stuModel->record();

    // 2. 获取模型中已有的总行数
    int index = this->stuModel->rowCount();

    // 3. 将创建好的空行插入到模型中
    this->stuModel->insertRecord(index, record);
}

void mainWidget::on_btn_shanchu_yonghu_2_clicked()
{
    // 1. 得到所有选中的行
    QItemSelectionModel *selectionModel = ui->tableView_chuankou_2->selectionModel();

    // 2. 从选中的行中获取到每一行的索引号对象
    // list = {QModelIndex(3), QModelIndex(5), QModelIndex(6)};
    QModelIndexList list = selectionModel->selectedRows();

    QMessageBox box(
        QMessageBox::Warning,
        "删除提醒",
        QString("您确定要删除%1条数据").arg(list.size()),
        QMessageBox::Yes | QMessageBox::No
    );

    box.setButtonText(QMessageBox::Yes, QString("删除%1条数据").arg(list.size()));
    box.button(QMessageBox::No)->setText("取消");

    int result = box.exec();

    if (result == QMessageBox::Yes)
    {
        // 3. 遍历链表，得到每个索引号，进行删除
        for (QModelIndex item : list)
        {
    //        qDebug() << item.row();
            this->stuModel->removeRow(item.row());
        }
        // 完成后直接提交数据库
        this->stuModel->submitAll();
    }
}

void mainWidget::on_btn_chaxun_yonghu_2_clicked()
{
    // 1. 获取用户输入的关键词
    QString keyword = ui->lineEdit_sousuo_yonghu_2->text().trimmed();

    // 2. 设置过滤条件
    this->stuModel->setFilter(QString("sname like '%%1%'").arg(keyword));

    // 3. 重新查询数据，并保存到model中
    this->stuModel->select();
}
